package com.example.basic.web.service.redis;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;


public interface IRedisService {
	
	public boolean del(String key);

    public boolean set(String key, String value);

    public String get(String key);

    public boolean expire(String key, long expire);

    public <T> boolean setList(String key, List<T> list);

    public <T> List<T> getList(String key, Class<T> clz);

    public boolean setMap(String key, Map<Object, Object> map);

    public Map<Object,Object> getMap(String key);

    public long lpush(String key, Object obj);

    public long rpush(String key, Object obj);

    public String lpop(String key);

    public long hlen(String key);

    public String hget(String key, String filed);

    public List<String> hMGetList(String key, byte[]... fields);

    public Map<String, String> hMGetMap(String key, byte[]... fields);

    public Map<String,String> hgetAll(String key);

    public Boolean hset(String key, String filed, String value);

    /**
     * @create 通过管道批量hset方法，能大大提高效率，这里list是个map，map必须是filed-value suntt_ruiyi 2019.11.15
     * @param key
     * @param list
     */
    public void batchHset(String key, List<Map<String, String>> list);

    public Boolean hdel(String key, String filed);

    public Set<String> hkeys(String key);

    public Set<String> sMembers(String key);

    public Boolean sIsMember(String key, String value);

    public Long sadd(String key, String value);

    public Long srem(String key, String value);

    /**
     * 根据前参数模糊查询keys（*：通配任意多个字符  ?：通配单个字符    []：通配括号内的某一个字符）
     * @param beforePattern
     * @return
     */
    public Set<String> getKeysByBeforePattern(String beforePattern);

    /**
     * 获取分布式锁
     * @param lockKey 锁（唯一的，可以用请求的url,方法的路径等）
     * @param expireTime 锁超期时间（单位：毫秒），超过该时间自动解锁
     * @return 是否获取成功
     */
    public boolean getDistributedLock(String lockKey, int expireTime) throws Exception;

    /**
     * 释放分布式锁，如果之前没有锁同样返回的true
     * @param lockKey 锁（唯一的，可以用请求的url,方法的路径等）
     * @return 是否释放成功
     */
    public boolean releaseDistributedLock(String lockKey);
    
    
    public int incrBy(String key, long incTimes);


    public Object eval(String script);

    public boolean expire(String key, long expire, TimeUnit timeUnit);

    Boolean setKey(String flag,String key,String value);

    String getRedis(String key);

    String rpop(String listName);

    /**
     * @create 数字做加减法 suntt_ruiyi 2019.11.01
     * @param key
     * @param hKey
     * @param delta 加减的数字，负数为减
     */
    public Long hIncrby(String key, String hKey, long delta);

    /**
     * @create 设置键值，前提是键不存在 suntt_ruiyi 2019.11.01
     * @param key
     * @param hKey
     * @param hValue
     * @return
     */
    public Boolean hSetnx(String key, Object hKey, Object hValue);
}
